#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=2503;
int n,m,k,kx,ky,sx,sy,tim;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
vector<bool>vis[N],used[N],niu[N];
struct Nod{int x,y;};
set<int>S[N];
bool In(int x,int y){return x>0&&x<=n&&y>0&&y<=m;}
int main()
{
	freopen("stamp.in","r",stdin);
	freopen("stamp.out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m>>k>>kx>>ky>>sx>>sy;char ch;
	for(int i=0;i<=n+1;i++)vis[i].resize(m+2),used[i].resize(m+2),niu[i].resize(m+2);
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>ch,vis[i][j]=ch=='.';
	queue<Nod>q;q.push({kx,ky});used[kx][ky]=1;
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)S[i].insert(j);
	S[kx].erase(ky);
	while(1)
	{
		queue<Nod>qq=q,add;
		while(qq.size())
		{
			Nod t=qq.front();qq.pop();
			for(int i=0;i<4;i++)
			{
				int tx=t.x+dx[i],ty=t.y+dy[i];
				if(In(tx,ty)&&vis[tx][ty]&&!used[tx][ty])
				    S[tx].erase(ty),used[tx][ty]=1,qq.push({tx,ty}),q.push({tx,ty});
			}
		}
		if(used[sx][sy]){cout<<tim;return 0;}
		while(q.size())
		{
			Nod t=q.front();q.pop();
			int wl=max(t.x-k+1,1),wr=min(t.x+k-1,n);
			for(int i=wl;i<=wr;i++)
			{
				auto tl=S[i].lower_bound(t.y-k),tr=S[i].upper_bound(t.y+k);
				for(auto it=tl;it!=tr;it++)add.push({i,*it});
				S[i].erase(tl,tr); 
			}
			int kl=t.x-k,kr=t.x+k;
			if(kl>0&&S[kl].size())
			{
				auto tl=S[kl].lower_bound(t.y-k+1),tr=S[kl].upper_bound(t.y+k-1);
				for(auto it=tl;it!=tr;it++)add.push({kl,*it});
				S[kl].erase(tl,tr); 
			}
			if(kr<=n&&S[kr].size())
			{
				auto tl=S[kr].lower_bound(t.y-k+1),tr=S[kr].upper_bound(t.y+k-1);
				for(auto it=tl;it!=tr;it++)add.push({kr,*it});
				S[kr].erase(tl,tr); 
			}
		}
		while(add.size())
		{
			Nod t=add.front();add.pop();
			vis[t.x][t.y]=1;q.push(t);
		}
		tim++;
		if(used[sx][sy]){cout<<tim;return 0;}
	}
}
